package DataStructureAndAlgorithm.Tedukuri.位运算;
import java.util.Scanner;
/*
算法
(按位枚举) O(n∗log2(m))
因为按位运算有个特点，没有进位或者错位
也就是只改变当前位，不影响其他位
所以可以考虑枚举每一位，选择填 0或1

接下来就是解决如何判断填 0或1
如果当前位填 1 之后不会超过 m, 那就可以填 1, 否则直接填 0;
如果当前位填 1 之后, 答案没有比填 0 大, 那为了让剩下还没填的位置尽可能大, 该位填 0
时间复杂度 O(n∗log2(m))
 */
public class AcWing_998 {
    static class pair{
        String first;
        int second;
        pair(String first,int second){
            this.first = first;
            this.second = second;
        }
    }
    static pair[] a = new pair[100005];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        for (int i = 1; i <= n; i++){
            String str = in.next();
            int x = in.nextInt();
            a[i] = new pair(str,x);
        }
        int val = 0;
        int ans = 0;
        for (int bit = 29; bit >= 0; bit--){
            int res0 = calc(bit,0,n);
            int res1 = calc(bit,1,n);
            //保证ans不会超过m
            if (val + (1 << bit) <= m && res0 < res1){
                val += 1 << bit;
                ans += res1 << bit;
            }else {
                ans += res0 << bit;
            }
        }
        System.out.print(ans);
    }
    static int calc(int bit,int now,int n){
        for (int i = 1; i <= n; i++){
            int x = a[i].second >> bit & 1;
            if (a[i].first.equals("AND")){
                now &= x;
            }else if (a[i].first.equals("OR")){
                now |= x;
            }else {
                now ^= x;
            }
        }
        return now;
    }
}
/*
21

世纪，许多人得了一种奇怪的病：起床困难综合症，其临床表现为：起床难，起床后精神不佳。

作为一名青春阳光好少年，atm 一直坚持与起床困难综合症作斗争。

通过研究相关文献，他找到了该病的发病原因： 在深邃的太平洋海底中，出现了一条名为 drd 的巨龙，它掌握着睡眠之精髓，能随意延长大家的睡眠时间。

正是由于 drd 的活动，起床困难综合症愈演愈烈， 以惊人的速度在世界上传播。

为了彻底消灭这种病，atm 决定前往海底，消灭这条恶龙。

历经千辛万苦，atm 终于来到了 drd 所在的地方，准备与其展开艰苦卓绝的战斗。

drd 有着十分特殊的技能，他的防御战线能够使用一定的运算来改变他受到的伤害。

具体说来，drd 的防御战线由 n

扇防御门组成。

每扇防御门包括一个运算 op
和一个参数 t，其中运算一定是 OR,XOR,AND

中的一种，参数则一定为非负整数。

如果还未通过防御门时攻击力为 x
，则其通过这扇防御门后攻击力将变为 x op t

。

最终 drd 受到的伤害为对方初始攻击力 x
依次经过所有 n

扇防御门后转变得到的攻击力。

由于 atm 水平有限，他的初始攻击力只能为 0
到 m 之间的一个整数（即他的初始攻击力只能在 0,1,…,m 中任选，但在通过防御门之后的攻击力不受 m

的限制）。

为了节省体力，他希望通过选择合适的初始攻击力使得他的攻击能让 drd 受到最大的伤害，请你帮他计算一下，他的一次攻击最多能使 drd 受到多少伤害。
输入格式

第 1
行包含 2 个整数，依次为 n,m，表示 drd 有 n 扇防御门，atm 的初始攻击力为 0 到 m

之间的整数。

接下来 n
行，依次表示每一扇防御门。每行包括一个字符串 op 和一个非负整数 t，两者由一个空格隔开，且 op 在前，t 在后，op 表示该防御门所对应的操作，t

表示对应的参数。
输出格式

输出一个整数，表示 atm 的一次攻击最多使 drd 受到多少伤害。
 */